package com.example.sxt_practise.thread;

/**
 * 生产者消费者模型
 * @author gaofeng
 * @date 2022年05月28日 11:40
 */
public class FlagLightTest {
    public static void main(String[] args) {
        Container container = new Container() ;
        new Assistent(container).start();
        new Watching(container).start();
    }
}

/**
 * 生产者和消费者共享的资源
 */
class MilkTea {
    Integer id ;

    public MilkTea(Integer id) {
        this.id = id;
    }
}

/**
 * 生产者
 */
class Assistent extends Thread {

    Container container ;

    Assistent(Container container) {
        this.container = container ;
    }



    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("做好了" + i + "奶茶");
        }
    }
}

/**
 * 消费者
 */
class Watching extends Thread {
    Container container ;

    Watching(Container container) {
        this.container = container ;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("取走了" + i + "奶茶");
        }
    }
}

/**
 * 缓冲区
 */
class TV {

   String milkTeaName ;

    /**
     * 信号灯
     */
    boolean flag = true;

    /**
     * 生产者
     */
    public synchronized void play(String milkTeaName) {
        //如果容器满了
        if (!flag) {
            // 通知消费者消费,生产者等待
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("奶茶做好了");
        //没满,放入产品
       milkTeaName = "厚芋泥波波" ;
        // 通知消费者消费
        this.notifyAll();
        this.flag = !this.flag ;
    }

    /**
     * 消费者
     */
    public synchronized void watch() {
        // 判断是否能消费
        if (flag) {
            // 等待生产者生产,消费者等待
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        // 能消费
        System.out.println("取走了" + this.milkTeaName);
        // 通知生产者生产
        this.notifyAll();
        this.flag = !this.flag ;
    }
}


